// *************************************************************************************************
//
// MK3D Engine
// --------------------------------------
// Copyright (C) 2007-2011 Zeb (mailto: zebbey@gmail.com)
//
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
//
// *************************************************************************************************

#ifndef __H_MK_SCENE_NODE__
#define __H_MK_SCENE_NODE__

#include "mk_transformation.h"
#include "mk_aabb.h"
#include "mk_ref_counter.h"

namespace MK3DE
{
	class CEntity;
	class MK3DE_API CSceneNode : public CRefCounter, public CTransformation 
	{
	public:
		CSceneNode(CSceneNode* parent);
		virtual ~CSceneNode();

		virtual void Update(DWORD dt, BOOL bChanged);

		std::string GetName() { return _name; }
		void SetName(const char* name) { _name = name; }

		DWORD GetChildCount() { return (DWORD)_vecChild.size(); }
		CSceneNode* GetChild(DWORD idx);

		CSceneNode* GetParent() { return _parent; }
		void SetParent(CSceneNode* parent) { _parent = parent; }

		void AddChild(CSceneNode* child);
		BOOL RemoveChild(CSceneNode* child);
		void RemoveAllChild();

		void AttachEntity(CEntity* entity);
		BOOL DeatachEntity(CEntity* entity);
		void DeatachAllEntity();
		DWORD GetEntityCount() { return (DWORD)_vecEntity.size(); }
		CEntity* GetEntity(DWORD idx);

	protected:
		void _UpdateAllEntities(DWORD dt, BOOL bChanged);
		void _UpdateAllChildren(DWORD dt, BOOL bChanged);

	protected:
		CSceneNode* _parent;
		std::string _name;
		std::vector<CEntity*> _vecEntity;
		std::vector<CSceneNode*> _vecChild;
	};

};

#endif // __H_MK_SCENE_NODE__